<?php
namespace kernel\library;

class Request extends Single 
{
    /**
     * 请求路径
     * @var string
     */
    public $path;
    /**
     * 请求类型
     * @var string
     */
    public $method;
        
    /**
     * 当前请求参数
     * @var array
     */
    public $param = [];
    
    /**
     * 请求cookie
     * @var array
     */
    public $cookie = [];    
    /**
     * 获取当前请求的参数
     * @access public
     * @param  string|array $name 变量名
     * @param  mixed        $default 默认值
     * @param  string|array $filter 过滤方法
     * @return mixed
     */
    public function param($name = '', $default = null, $filter = 'addslashes')
    {
        $data = isset($this->param[$name]) ? $this->param[$name] : $default;
        $this->filterData($data, $filter);
        return $data;
    }
    /**
     * 设置cookie
     * @param array $cookie
     */
    public function setCookie(array $cookie){
        $this->cookie = $cookie;
    }
    /**
     * 获取cookie
     * @return array
     */
    public function cookie(string $name = ''){
        if(!$name){
            return $this->cookie;
        }
        return $this->cookie[$name] ?? null;
    }
    /**
     * .获取路径
     * @return string
     */
    public function path(){
        return $this->path;
    }
    
    /**
     * .返回所有参数
     * @param string $filter
     * @return array
     */
    public function all($filter = 'addslashes'){
        $data = $this->param;
        if($filter){
            $this->filterData($data, $filter);
        }
        return $data;
    }
    /**
     * .设置参数
     */
    public function setParam(array $param){
        $this->param = array_merge($this->param, $param);
    }
    
    /**
     * .设置路径
     * @param string $path
     */
    public function setPath(string $path){
        $this->path = $path;
    }
    /**
     * 字段过滤
     * @param  $data
     * @param  $filter 
     */
    protected function filterData(&$data, $filter){
        if(is_array($data)){
            foreach($data as $k => $v){
                $this->filterData($data[$k], $filter);
            }
        }else{
            $data = $filter($data);
        }
    }
    
    /**
     * 获取当前请求的时间
     * @access public
     * @param  bool $float 是否使用浮点类型
     * @return integer|float
     */
    public function time(bool $float = false)
    {
        return $float ? $_SERVER['REQUEST_TIME_FLOAT'] : $_SERVER['REQUEST_TIME'];
    }
    /**
     * .设置请求方法
     * @param string $method
     */
    public function setMethod(string $method){
        $this->method = $method;
    }
    /**
     * 当前的请求类型
     * @access public
     * @param  bool $origin 是否获取原始请求类型
     * @return string
     */
    public function method(bool $origin = false): string
    {        
        return $this->method;
    }
        
    
    /**
     * 获取server参数
     * @access public
     * @param  string $name 数据名称
     * @param  string $default 默认值
     * @return mixed
     */
    public function server(string $name = '', string $default = '')
    {
        if (empty($name)) {
            return $_SERVER;
        } else {
            $name = strtoupper($name);
        }
        
        return $_SERVER[$name] ?? $default;
    }
}

